package com.edev.support.utils;

import com.edev.support.exception.OrmException;
import com.edev.support.xml.FileResourceLoader;
import com.edev.support.xml.ResourceLoader;
import com.edev.support.xml.UrlResourceLoader;
import lombok.NonNull;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * JSON文件读取工具类（静态方法）
 * 
 * 核心功能：
 * 1. 支持从URL路径或本地文件系统读取JSON文件
 * 2. 自动处理文件编码（UTF-8）
 * 3. 统一异常处理机制
 * 
 * 使用示例：
 * // 读取类路径下的JSON文件
 * String json = JsonFile.read("classpath:config.json");
 * 
 * // 读取本地文件系统JSON文件
 * String json = JsonFile.read("file:/path/to/data.json");
 * 
 * 实现特性：
 * - 优先尝试URL资源加载（支持网络/类路径资源）
 * - 次优尝试本地文件系统加载
 * - 自动检测.json后缀名
 */
public class JsonFile {
    private JsonFile() {}
    /**
     * 根据某个路径读取JSON文件内容，支持URL、文件系统和类路径。
     * 路径格式说明：
     * - classpath:config.json → 从类路径加载
     * - file:/data/config.json → 从文件系统加载
     * - http://example.com/data.json → 从网络URL加载
     * @param file 文件路径（支持URL和本地路径）
     * @return JSON格式字符串
     * @throws OrmException 出现以下情况时抛出：
     *                      - 文件非.json后缀
     *                      - 文件不存在或读取失败
     * 
     */
    public static String read(@NonNull String file) {
        StringBuilder buffer = new StringBuilder();
        boolean success;
        ResourceLoader loader;
        if(!file.endsWith(".json"))
            throw new OrmException("Please input json file[%s]",file);

        loader = new UrlResourceLoader();
        success = loader.loadResource(inputStream -> readStream(inputStream, buffer), file);
        if (success) return buffer.toString();

        loader = new FileResourceLoader();
        success = loader.loadResource(inputStream -> readStream(inputStream, buffer), file);
        if (success) return buffer.toString();

        throw new OrmException("No found the json file[%s]",file);
    }

    private static void readStream(InputStream inputStream, StringBuilder buffer) {
        if(inputStream==null) return;
        Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
        int i;
        try {
            while ((i = reader.read()) != -1) buffer.append((char)i);
        } catch (IOException e) {
            throw new OrmException("failure to read json file",e);
        }
    }
}
